--- title: "L2-001 紧急救援" created: 2025-11-28 tags: - 算法 --- # L2-001 紧急救援 ## 题目 [L2-001 紧急救援](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=994805073643683840&page=1) ![[image-18539523.png]] ## 思路分析 ![[image-ec48f4ed.png]] 最短路问题 同时需要维护很多额外信息:最短路有几条 该路径累积下来的救援人数有多少 以及具体路径 ## 代码实现 ```cpp #include using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; const int N=510; int n,m,s,d; int cityPeopleNum[N]; int g[N][N],dist[N],st[N],peopleNum[N],path[N],roadNum[N]; void dijkstra(){ memset(dist,0x3f,sizeof dist); dist[s]=0; roadNum[s]=1; peopleNum[s]=cityPeopleNum[s]; for(int i=0;idist[choseCity]+g[choseCity][j]){ //如果更短直接更新 dist[j]=dist[choseCity]+g[choseCity][j]; peopleNum[j]=peopleNum[choseCity]+cityPeopleNum[j]; path[j]=choseCity; roadNum[j]=roadNum[choseCity]; }else if(dist[j] == dist[choseCity]+g[choseCity][j]){ //如果一样短 最短路数量+1 roadNum[j]+=roadNum[choseCity]; if(peopleNum[j]>n>>m>>s>>d; for(int i=0;i>cityPeopleNum[i]; for(int i=0;i>x>>y>>z; g[x][y]=g[y][x]=min(g[x][y],z); } dijkstra(); cout<